<?php

use think\migration\Migrator;
use think\migration\db\Column;

class SystemBaseTables extends Migrator
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(): void
    {
        $this->_createAdminRoles();
        $this->_createAdminUser();
        $this->_createSystemConfig();
        $this->_createRouteMenu();
        $this->_createAttachment();
        $this->_createDepartment();
        $this->_createModules();
        $this->_createPlugins();
        $this->_createHooks();
        $this->_createMessage();
    }

    /**
     * 创建管理角色表
     *
     * @return void
     */
    private function _createAdminRoles(): void
    {
        // 创建管理员角色表
        $table = $this->table('admin_role', ['comment' => '管理员角色表']);
        $table->addColumn('group_id', 'integer', ['comment' => '所属分组', 'default' => 0])
              ->addColumn('role_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '角色名称'])
              ->addColumn('role_code', 'string', ['limit' => 32, 'default' => '', 'comment' => '角色标识'])
              ->addColumn('allow_auth', 'string', ['limit' => 500, 'default' => '', 'comment' => '允许授权访问的菜单或按钮ID数组JSON字段'])
              ->addColumn('pid', 'integer', ['default' => 0, 'comment' => '父级角色'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();

        // 创建权限规则表
        $table = $this->table('admin_rule', ['comment' => '管理员权限规则表']);
        $table->addColumn('group_id', 'integer', ['comment' => '所属分组', 'default' => 0])
              ->addColumn('rule_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '权限名称'])
              ->addColumn('rule_code', 'string', ['limit' => 32, 'default' => '', 'comment' => '权限标识'])
              ->addColumn('pid', 'integer', ['default' => 0, 'comment' => '父级权限'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addIndex(['rule_code'], ['unique' => true])
              ->create();

        // 创建管理员角色权限表
        $table = $this->table('admin_role_access', ['comment' => '管理员角色映射表']);
        $table->addColumn('role_id', 'integer', ['comment' => '角色ID'])
              ->addColumn('user_id', 'integer', ['comment' => '管理员ID'])
              ->addIndex(['role_id', 'user_id'], ['unique' => true])
              ->create();
    }

    /**
     * 创建管理员表
     *
     * @return void
     */
    private function _createAdminUser(): void
    {
        $table = $this->table('admin_user', ['comment' => '管理员表']);
        $table->addColumn('username', 'string', ['limit' => 32, 'default' => '', 'comment' => '用户名'])
              ->addColumn('password', 'string', ['limit' => 32, 'default' => '', 'comment' => '密码'])
              ->addColumn('nickname', 'string', ['limit' => 12, 'default' => '', 'comment' => '昵称'])
              ->addColumn('avatar', 'string', ['limit' => 255, 'default' => '', 'comment' => '头像'])
              ->addColumn('email', 'string', ['limit' => 32, 'default' => '', 'comment' => '邮箱'])
              ->addColumn('mobile', 'string', ['limit' => 32, 'default' => '', 'comment' => '手机号码'])
              ->addColumn('department_id', 'integer', ['default' => 0, 'comment' => '部门ID'])
              ->addColumn('salt', 'string', ['limit' => 32, 'default' => '', 'comment' => '密码盐'])
              ->addColumn('login_time', 'integer', ['default' => 0, 'comment' => '上次登录时间'])
              ->addColumn('login_ip', 'string', ['limit' => 32, 'default' => '', 'comment' => '上次登录IP'])
              ->addColumn('login_count', 'integer', ['default' => 0, 'comment' => '登录次数'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();
    }

    /**
     * 创建系统配置表
     *
     * @return void
     */
    private function _createSystemConfig(): void
    {

        $table = $this->table('config_group', ['comment' => '系统配置分组表']);
        $table->addColumn('group_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '分组名称'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->create();

        $table = $this->table('config_list', ['comment' => '系统配置表']);
        $table->addColumn('group_id', 'integer', ['default' => 0, 'comment' => '所属分组'])
              ->addColumn('config_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '配置中文名称'])
              ->addColumn('config_variable', 'string', ['limit' => 32, 'default' => '', 'comment' => '配置调用变量名'])
              ->addColumn('config_value', 'string', ['limit' => 255, 'default' => '', 'comment' => '配置默认值'])
              ->addColumn('config_type', 'string', ['limit' => 32, 'default' => '', 'comment' => '配置类型, text, select, radio, checkbox, textarea'])
              ->addColumn('config_options', 'string', ['limit' => 500, 'default' => '', 'comment' => '配置选项'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();
    }

    /**
     * 创建路由菜单表
     *
     * @return void
     */
    private function _createRouteMenu(): void
    {
        $table = $this->table('route_menu', ['comment' => '路由菜单表']);
        $table->addColumn('menu_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '菜单名称'])
              ->addColumn('menu_type', 'string', ['limit' => 32, 'default' => '', 'comment' => '菜单标识, menu为菜单,btn为按钮'])
              ->addColumn('pid', 'integer', ['default' => 0, 'comment' => '父级菜单'])
              ->addColumn('menu_tree', 'string', ['limit' => 255, 'default' => '', 'comment' => '菜单树'])
              ->addColumn('route_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '路由名称'])
              ->addColumn('route_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '路由路径'])
              ->addColumn('component_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '组件路径'])
              ->addColumn('redirect_url', 'string', ['limit' => 255, 'default' => '', 'comment' => '重定向URL，跳转、内嵌及外链URL'])
              ->addColumn('icon', 'string', ['limit' => 128, 'default' => '', 'comment' => '图标'])
              ->addColumn('extra_icon', 'string', ['limit' => 128, 'default' => '', 'comment' => '右侧扩展图标'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addColumn('roles', 'string', ['limit' => 255, 'default' => '', 'comment' => '可访问的角色数组'])
              ->addColumn('permission_code', 'string', ['limit' => 255, 'default' => '', 'comment' => '按钮操作权限标识，例如：AdminUser@List.Add'])
              ->addColumn('is_hide', 'boolean', ['default' => false, 'comment' => '是否隐藏'])
              ->addColumn('is_link', 'boolean', ['default' => false, 'comment' => '是否外链'])
              ->addColumn('is_affix', 'boolean', ['default' => false, 'comment' => '是否固定'])
              ->addColumn('is_iframe', 'boolean', ['default' => false, 'comment' => '是否内嵌'])
              ->addColumn('is_keep_alive', 'boolean', ['default' => false, 'comment' => '是否缓存'])
              ->addColumn('show_link', 'boolean', ['default' => true, 'comment' => '是否显示菜单'])
              ->addColumn('show_parent', 'boolean', ['default' => true, 'comment' => '是否显示父级菜单'])
              ->addColumn('active_path', 'string', ['limit' => 50, 'default' => '', 'comment' => '激活菜单名称'])
              ->addColumn('enter_transition', 'string', ['limit' => 255, 'default' => '', 'comment' => '进入动画'])
              ->addColumn('leave_transition', 'string', ['limit' => 255, 'default' => '', 'comment' => '离开动画'])
              ->addColumn('frame_loading', 'boolean', ['default' => false, 'comment' => '是否显示加载动画'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();
    }

    /**
     * 创建附件表
     *
     * @return void
     */
    private function _createAttachment(): void
    {
        $table = $this->table('attachment', ['comment' => '附件表']);
        $table->addColumn('file_name', 'string', ['limit' => 255, 'default' => '', 'comment' => '文件名'])
              ->addColumn('file_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '文件路径'])
              ->addColumn('file_size', 'integer', ['default' => 0, 'comment' => '文件大小'])
              ->addColumn('file_type', 'string', ['limit' => 32, 'default' => '', 'comment' => '文件类型'])
              ->addColumn('file_md5', 'string', ['limit' => 32, 'default' => '', 'comment' => '文件md5'])
              ->addColumn('file_sha1', 'string', ['limit' => 40, 'default' => '', 'comment' => '文件sha1'])
              ->addColumn('file_ext', 'string', ['limit' => 32, 'default' => '', 'comment' => '文件后缀'])
              ->addColumn('file_mime', 'string', ['limit' => 32, 'default' => '', 'comment' => '文件mime'])
              ->addColumn('file_width', 'integer', ['default' => 0, 'comment' => '文件宽度'])
              ->addColumn('file_height', 'integer', ['default' => 0, 'comment' => '文件高度'])
              ->addColumn('file_duration', 'integer', ['default' => 0, 'comment' => '文件时长'])
              ->addColumn('file_frame_rate', 'integer', ['default' => 0, 'comment' => '文件帧率'])
              ->addColumn('storage', 'string', ['limit' => 32, 'default' => 'local', 'comment' => '存储方式,local为本地，qiniu为七牛云，aliyun为阿里云，tencent为腾讯云'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();
    }

    /**
     * 创建模块表
     *
     * @return void
     */
    private function _createModules(): void
    {
        $table = $this->table('modules', ['comment' => '模块表']);
        $table->addColumn('module_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '模块名称'])
              ->addColumn('module_code', 'string', ['limit' => 32, 'default' => '', 'comment' => '模块编码'])
              ->addColumn('module_desc', 'string', ['limit' => 255, 'default' => '', 'comment' => '模块描述'])
              ->addColumn('module_version', 'string', ['limit' => 32, 'default' => '', 'comment' => '模块版本'])
              ->addColumn('module_author', 'string', ['limit' => 32, 'default' => '', 'comment' => '模块作者'])
              ->addColumn('module_website', 'string', ['limit' => 255, 'default' => '', 'comment' => '模块官网'])
              ->addColumn('module_icon', 'string', ['limit' => 128, 'default' => '', 'comment' => '模块图标'])
              ->addColumn('module_config', 'text', ['default' => '', 'comment' => '模块配置'])
              ->addColumn('module_type', 'boolean', ['default' => 0, 'comment' => '模块类型,0系统模块，1业务模块'])
              ->addColumn('module_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '模块路径'])
              ->addColumn('install_status', 'boolean', ['default' => 0, 'comment' => '安装状态,0未安装，1已安装'])
              ->addColumn('module_status', 'boolean', ['default' => 1, 'comment' => '模块状态,0禁用，1启用'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->create();
    }

    /**
     * 创建插件表
     *
     * @return void
     */
    private function _createPlugins(): void
    {
        $table = $this->table('plugins', ['comment' => '插件表']);
        $table->addColumn('plugin_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '插件名称'])
              ->addColumn('plugin_code', 'string', ['limit' => 32, 'default' => '', 'comment' => '插件编码'])
              ->addColumn('plugin_desc', 'string', ['limit' => 255, 'default' => '', 'comment' => '插件描述'])
              ->addColumn('plugin_version', 'string', ['limit' => 32, 'default' => '', 'comment' => '插件版本'])
              ->addColumn('plugin_author', 'string', ['limit' => 32, 'default' => '', 'comment' => '插件作者'])
              ->addColumn('plugin_website', 'string', ['limit' => 255, 'default' => '', 'comment' => '插件官网'])
              ->addColumn('plugin_icon', 'string', ['limit' => 128, 'default' => '', 'comment' => '插件图标'])
              ->addColumn('plugin_config', 'text', ['default' => '', 'comment' => '插件配置'])
              ->addColumn('plugin_type', 'boolean', ['default' => 0, 'comment' => '插件类型,0系统插件，1业务插件'])
              ->addColumn('plugin_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '插件路径'])
              ->addColumn('install_status', 'boolean', ['default' => 0, 'comment' => '安装状态,0未安装，1已安装'])
              ->addColumn('plugin_status', 'boolean', ['default' => 1, 'comment' => '插件状态,0禁用，1启用'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->create();
    }

    /**
     * 创建钩子表
     *
     * @return void
     */
    private function _createHooks(): void
    {
        $table = $this->table('hooks', ['comment' => '钩子表']);
        $table->addColumn('hook_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '钩子名称'])
              ->addColumn('hook_desc', 'string', ['limit' => 255, 'default' => '', 'comment' => '钩子描述'])
              ->addColumn('hook_type', 'boolean', ['default' => 0, 'comment' => '钩子类型,0系统钩子，1业务钩子'])
              ->addColumn('hook_param', 'string', ['limit' => 255, 'default' => '', 'comment' => '钩子参数'])
              ->addColumn('hook_path', 'string', ['limit' => 255, 'default' => '', 'comment' => '钩子路径'])
              ->addColumn('hook_load', 'boolean', ['default' => 0, 'comment' => '是否启动加载, 0:不加载,1:加载'])
              ->addColumn('hook_status', 'boolean', ['default' => 1, 'comment' => '钩子状态,0禁用，1启用'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->create();
    }

    /**
     * 创建部门表
     *
     * @return void
     */
    private function _createDepartment(): void
    {
        $table = $this->table('department', ['comment' => '部门表']);
        $table->addColumn('department_name', 'string', ['limit' => 32, 'default' => '', 'comment' => '部门名称'])
              ->addColumn('pid', 'integer', ['default' => 0, 'comment' => '父级部门'])
              ->addColumn('department_tree', 'string', ['limit' => 255, 'default' => '', 'comment' => '部门树'])
              ->addColumn('leader_name', 'string', ['limit' => 255, 'default' => '', 'comment' => '部门负责人'])
              ->addColumn('leader_phone', 'string', ['limit' => 32, 'default' => '', 'comment' => '部门负责人电话'])
              ->addColumn('department_type', 'integer', ['default' => 2, 'comment' => '部门类型 0为总公司，1为分公司，2为部门， 3为小组'])
              ->addColumn('address', 'string', ['limit' => 255, 'default' => '', 'comment' => '地址'])
              ->addColumn('province', 'string', ['limit' => 32, 'default' => '', 'comment' => '所在省份代码'])
              ->addColumn('city', 'string', ['limit' => 32, 'default' => '', 'comment' => '所在城市代码'])
              ->addColumn('area', 'string', ['limit' => 32, 'default' => '', 'comment' => '所在区域代码'])
              ->addColumn('logo', 'string', ['limit' => 255, 'default' => '', 'comment' => 'logo'])
              ->addColumn('configs', 'text', ['default' => '', 'comment' => '配置信息'])
              ->addColumn('remark', 'string', ['limit' => 255, 'default' => '', 'comment' => '备注'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('rank', 'integer', ['default' => 0, 'comment' => '排序'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态'])
              ->create();
    }

    /**
     * 创建消息表
     *
     * @return void
     */
    private function _createMessage(): void
    {
        $table = $this->table('message', ['comment' => '消息表']);
        $table->addColumn('module', 'string', ['default' => 'system', 'comment' => '消息类型'])
              ->addColumn('title', 'string', ['limit' => 255, 'default' => '', 'comment' => '消息标题'])
              ->addColumn('content', 'text', ['default' => '', 'comment' => '消息内容'])
              ->addColumn('send_uid', 'integer', ['default' => 0, 'comment' => '发送人'])
              ->addColumn('receive_uid', 'integer', ['default' => 0, 'comment' => '接收人'])
              ->addColumn('create_time', 'integer', ['default' => 0, 'comment' => '创建时间'])
              ->addColumn('update_time', 'integer', ['default' => 0, 'comment' => '更新时间'])
              ->addColumn('link', 'string', ['limit' => 255, 'default' => '', 'comment' => '链接'])
              ->addColumn('params', 'string', ['limit' => 255, 'default' => '', 'comment' => 'JSON格式参数'])
              ->addColumn('status', 'boolean', ['default' => 1, 'comment' => '状态，0为未读，1为已读'])
              ->create();
    }

}
